package com.momo.hr.controller;

import com.momo.hr.bean.Hr;
import com.momo.hr.bean.RespBean;
import com.momo.hr.config.FastDFSUtils;
import com.momo.hr.service.HrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * @author zhubo
 * Hr信息控制器，
 * 展示Hr的个人信息
 */
@RestController
public class HrInfoController {

    @Autowired
    HrService hrService;

    //注入fastDfshost访问路径
    @Value("${fastDfs.nginx.host}")
    String nginxHost;


    /**
     *
     * @param authentication SpringSecurity中给我们封装好的当前登录对象
     * @return
     */
    @GetMapping("/hr/info")
    public Hr getCurrentHr(Authentication authentication) {
        Hr hr = (Hr) authentication.getPrincipal();
        return hr;
    }

    /**
     * 跟新用户的信息的接口，这里我不单单要更新数据库的信息，还要更新SpringSecurity中的相关信息
     * 如果不去实时更新当前用户数据，会导致当前SpringSecurity和用户系统信息不一致性的问题
     * @param hr
     * @return
     */
    @PutMapping("/hr/info")
    public RespBean updateHr(@RequestBody Hr hr,Authentication authentication){
        if(hrService.updateHr(hr) == 1){
            /**
             * authentication 中的用户信息进行更新
             */
            SecurityContextHolder.getContext()
                    .setAuthentication(new UsernamePasswordAuthenticationToken(
                            hr,//用户更新的信息
                            authentication.getCredentials(), //用户密码
                            authentication.getAuthorities()));//用户角色信息
            return RespBean.ok("更新成功");
        }
            return RespBean.error("更新失败");
    }

    /**
     * 更新密码的方法
     * @param Info 这里没有不必要再为更新密码创建实体类，所以这里就创建了一个Map集合
     * @return
     */
    @PutMapping("/hr/updatepass")
    public RespBean updatePassword(@RequestBody Map<String,Object> Info){
        String oldpass = (String) Info.get("oldpass");
        String pass = (String) Info.get("pass");
        Integer hrid = (Integer) Info.get("hrid");
        if(this.hrService.updatePassword(oldpass,pass,hrid)){
            return RespBean.ok("更新成功");
        }
            return RespBean.error("更新失败");
    }


    @PostMapping("/hr/userface")
    public RespBean updateHrUserFace(MultipartFile file,Integer id,Authentication authentication){
        String fileId = FastDFSUtils.uploadFile(file);
        String url = nginxHost + fileId;//新的访问路径 添加了Nginx的Host地址
        Hr principal = (Hr) authentication.getPrincipal();//拿到当前用户
        principal.setUserface(url);//重新设置url
        SecurityContextHolder.getContext().setAuthentication(
                new UsernamePasswordAuthenticationToken(
                        principal,//当前用户
                        authentication.getCredentials(),//当前登录者的口令凭证
                        authentication.getAuthorities()));//当前用户的角色集合
        if(hrService.updateUserFace(url,id)){
            return RespBean.ok("上传成功",url);
        }
        return RespBean.error("上传失败");
    }

}
